package top.shiyiri.java;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * @author Aunean
 * @date 2022/1/16 14:04
 */
public class Java10Test {

    /*
    Java10的新特性：局部变量的类型推断
     */
    @Test
    public void test1() {
        //声明变量时，根据所赋的值，推断变量的类型
        var num = 10;
        System.out.println(num);

        var list = new ArrayList<Integer>();
        list.add(1233);
        System.out.println(list);

        //遍历操作
        for (var i: list) {
            System.out.println(i);
            System.out.println(i.getClass());
        }

        //普通的遍历操作
        for (var i = 0; i < 3; i++) {
            System.out.println(i);
        }
    }

    @Test
    public void test2() {
        //局部变量不赋值不能实现类型推断
        //var str;

        var num = "hello";
        System.out.println(num.getClass());

        //lambda表达式中，左边的函数式接口不能声明为 var
        //var sup = Math::random;
        Supplier<Double> supplier = Math::random;
        System.out.println(supplier.get());

        //数组的静态初始化中
        int[] arr = new int[]{12, 3};
        int[] arr1 = {12, 3};

        var arr2 = new int[]{12, 4};
        //var arr3 = {12, 4};
    }

    @Test
    public void test3() {
        //情况1：没有初始化的局部变量声明
        //var s = null;

        //情况6：catch块
//        try {
//
//        } catch (var e) {
//
//        }

    }

    //情况2：方法的返回类型
//    public var method1() {
//        return 0;
//    }

    //情况3：方法的参数类型
//    public void method2(var num) {
//
//    }

    //情况4：构造器的参数类型
//    public Java10Test(var i) {
//
//    }

    //情况5：属性（属性有默认值）
    //var num = 10;

    @Test
    public void test4() {
        try {
            var url = new URL("http://www.atguigu.com");
            var connection = url.openConnection();
            var reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    //Java10的新特性：集合中新增的 copyOf()，用于创建一个只读的集合
    @Test
    public void test5() {
        //示例1：
        var list1 = List.of("Java", "Python", "C");
        var copy1 = List.copyOf(list1);
        System.out.println(list1 == copy1); // true
        //示例2：
        var list2 = new ArrayList<String>();
        var copy2 = List.copyOf(list2);
        System.out.println(list2 == copy2); // false
        //示例1和2代码基本一致，为什么一个为true,一个为false?
        //结论：copyOf(xx coll)：如果参数本身就是一个只读集合，则 copyOf() 返回值
        //即为当前的 coll，如果参数 coll 不是一个只读集合，则 copyOf() 返回一个新的集合，这个集合是只读的。
    }
}
